Zum Hauptinhalt springen

Einheit 5 — Das Gedächtnis: Verlauf, Vorgänge, Rückfragen

Was du nach dieser Einheit weißt: Du kannst die drei Ebenen des Gedächtnisses in Tabellen abbilden, Rückfragen über mehrere Nachrichten hinweg verfolgen und Anschlussfragen wie „und im September?“ richtig einordnen.

Workflows vergessen — Tabellen nicht​

Jede Nachricht durchläuft den Workflow einzeln. Was bei der vorigen Nachricht passiert ist, weiß der Workflow nicht — es sei denn, es steht in einer Tabelle. Das Gedächtnis eines Assistenten besteht deshalb aus Tabellen in der internen Datenbank. Wie du sie anlegst, kennst du aus Kurs 2.

Drei Ebenen haben sich bewährt:

EbeneFrageTabelleLebensdauer
KurzzeitWorüber reden wir gerade?assistent_verlaufTage
ArbeitWas ist offen, was ist erledigt?assistent_vorgangWochen
LangzeitWas habe ich gelernt?assistent_lernbeispiel, assistent_begriffdauerhaft

Die Langzeit-Ebene ist Thema von Einheit 6. Hier geht es um die ersten beiden.

Der Verlauf​

CREATE TABLE assistent_verlauf (
id INTEGER PRIMARY KEY AUTOINCREMENT,
unterhaltung_id TEXT,
rolle TEXT, -- 'nutzer' oder 'assistent'
text TEXT,
vorgang_id TEXT,
erstellt TEXT DEFAULT (datetime('now'))
);

Jede eingehende Nachricht schreibt der Router hinein, jede Antwort der Rückkanal. Der Router lädt die letzten sechs bis acht Einträge derselben Unterhaltung und gibt sie der KI-Erkennung mit.

Damit versteht die KI Anschlussfragen:

Nutzer:     Wie hoch war der Umsatz im Oktober?
Assistent: Umsatz Oktober 2026: 84.200 € (Vorjahr: 71.900 €, +17 %)
Nutzer: und im September?

Ohne Verlauf ist „und im September?“ nicht zuzuordnen. Mit Verlauf erkennt die KI: gleiche Kennzahl, anderer Zeitraum.

Nicht zu viel Verlauf

Mehr als acht Einträge helfen selten — sie machen den Prompt länger und verleiten die KI dazu, sich auf ein älteres Thema zu beziehen. Kürze lange Einträge (etwa auf 300 Zeichen), bevor sie in den Prompt kommen.

Vorgänge​

Jede Nachricht, die etwas auslöst, wird zum Vorgang. Die ID leitet sich aus der Nachrichten-ID ab (V-48211) — so ist sie eindeutig und ein zweiter Durchlauf derselben Nachricht trifft auf denselben Vorgang.

CREATE TABLE assistent_vorgang (
id TEXT PRIMARY KEY,
faehigkeit TEXT,
text TEXT,
parameter TEXT, -- JSON, z. B. Zusammenfassung der KI
status TEXT,
risiko INTEGER,
sicherheit REAL,
unterhaltung_id TEXT,
nachricht_id TEXT,
antwort TEXT,
erstellt TEXT,
aktualisiert TEXT
);

Der Lebenslauf eines Vorgangs:

laeuft ──→ beantwortet / erledigt
│
├──→ rueckfrage ──→ (Antwort kommt) ──→ neuer Vorgang, alter → abgebrochen
├──→ bestaetigung ──→ ja → erledigt | nein / Frist abgelaufen → abgebrochen
├──→ wartet_freigabe ──→ Human Task erledigt → erledigt
└──→ fehler

Router und Rückkanal schreiben den Vorgang per Upsert fort — der Eintrag wird angelegt, wenn er fehlt, sonst aktualisiert:

INSERT INTO assistent_vorgang (id, faehigkeit, text, status, unterhaltung_id, nachricht_id, erstellt, aktualisiert)
VALUES ('{{ vorgang_id }}', '{{ faehigkeit }}', '{{ text_sql }}', '{{ vorgang_status }}',
'{{ unterhaltung_id }}', '{{ nachricht_id }}', datetime('now'), datetime('now'))
ON CONFLICT(id) DO UPDATE SET
status = excluded.status,
aktualisiert = excluded.aktualisiert

Einmal abgeschlossene Vorgänge (erledigt, abgebrochen) sollten nicht wieder geöffnet werden. Das sicherst du im DO UPDATE mit einer Bedingung ab:

  status = CASE WHEN assistent_vorgang.status IN ('erledigt', 'abgebrochen')
THEN assistent_vorgang.status ELSE excluded.status END

„Was läuft gerade?“​

Mit der Vorgangstabelle beantwortet der Assistent die Frage nach offenen Aufgaben ohne jede KI:

SELECT id, faehigkeit, status, substr(text, 1, 80) AS text, erstellt
FROM assistent_vorgang
WHERE status NOT IN ('beantwortet', 'erledigt', 'abgebrochen')
AND erstellt > datetime('now', '-14 days')
ORDER BY erstellt DESC LIMIT 10

Das ist für die Nutzer eine der wertvollsten Funktionen überhaupt: Sie sehen, was der Assistent noch für sie erledigen will oder worauf er wartet.

Rückfragen über mehrere Nachrichten​

Stellt der Router eine Rückfrage, speichert er den Vorgang mit Status rueckfrage. Bei der nächsten Nachricht findet er beim Kontext-Laden diesen offenen Vorgang (Einheit 3, Spalte offen) und weiß: Die neue Nachricht ist die Antwort.

Dann gibt es zwei Wege:

  • Antwort ist eine Auswahl („1“, „2“) → der Router nimmt den gewählten Skill, führt aus und merkt sich die Zuordnung (Einheit 6).
  • Antwort ist freier Text → der Router hängt ihn an den ursprünglichen Text an und schickt beides zusammen an die KI-Erkennung:
Wie lief das mit dem Ding letzte Woche?
Ergänzung auf deine Rückfrage: ich meine den LinkedIn-Post zum Whitepaper

Der alte Vorgang wird auf abgebrochen gesetzt (mit Verweis auf den neuen), damit „Was läuft?“ keine Leichen zeigt.

Bleibt die zweite Antwort ebenfalls unklar, fragt der Router nicht ein drittes Mal, sondern sagt ehrlich, dass er es nicht verstanden hat, und verweist auf die Hilfe. Endlose Rückfragen frustrieren mehr als ein klares „Das kann ich nicht“.

Das Protokoll​

Neben Verlauf und Vorgang lohnt eine dritte, schlichte Tabelle: das Aktionsprotokoll.

CREATE TABLE assistent_aktion (
id INTEGER PRIMARY KEY AUTOINCREMENT,
vorgang_id TEXT,
faehigkeit TEXT,
system TEXT, -- z. B. 'github', 'crm', 'chat'
aktion TEXT, -- z. B. 'ticket_angelegt'
ergebnis TEXT,
erstellt TEXT DEFAULT (datetime('now'))
);

Jeder Skill, der etwas in einem anderen System verändert, schreibt hier eine Zeile. Damit beantwortest du später die Frage „Wer hat das angelegt — und warum?“ in Sekunden.

Aufräumen​

Der Verlauf enthält, was Menschen geschrieben haben — also möglicherweise personenbezogene Daten. Lösche ihn regelmäßig, zum Beispiel mit einem zeitgesteuerten Internal Storage Agent:

DELETE FROM assistent_verlauf WHERE erstellt < datetime('now', '-30 days')

Vorgänge und Protokoll kannst du länger aufbewahren, solltest aber auch dort eine Frist festlegen und dokumentieren.

Kurzer Selbst-Check​

Warum leitet man die Vorgangs-ID aus der Nachrichten-ID ab, statt eine zufällige ID zu erzeugen?

Damit eine doppelt zugestellte Nachricht keinen zweiten Vorgang erzeugt. Gleiche Nachricht → gleiche ID → der Upsert aktualisiert den vorhandenen Eintrag.

Die KI bezieht „und im September?“ auf ein Thema von gestern. Woran liegt das vermutlich?

Der Verlauf ist zu lang oder nicht zeitlich begrenzt. Lade nur die letzten Einträge und nur aus einem kurzen Zeitfenster, zum Beispiel den letzten zwei Stunden.